using System.Collections.Generic;
using Gameplay.PVE.Entity;
using Gameplay.PVE.Utils;
using UnityEngine;
using Yoozoo.Managers;
using Yoozoo.Gameplay.RTS;

namespace Gameplay.PVE
{
    public enum PveDropType
    {
        ShotGun,
        Money,
        BulletBag,
        MedicBag,
    }

    public class DropFlyUI
    {
        public GameObject uiObject;
        public RectTransform rectTransform;
    }
    
    public class PveDropManager
    {
        private List<DropItem> itemList = new List<DropItem>();
        private static PveDropManager Instance;
        private List<DropFlyUI> dropUIPool;
        private GameObject dropUIPoolRoot;
        
        public void Initialize()
        {
            Instance = this;
        }
        
        public void Dispose()
        {
            Instance = null;
        }

        public void SpawnItem(int stage,Vector3 position,PveDropType type,float range)
        {
            var item = ClassManager.Get<DropItem>();
            item.Initialize(stage,position,type,range);
            itemList.Add(item);
            //CheckDropUIPool();
        }
        
        
        public void Update()
        {
            CheckPickUp();
            for (int i = 0; i < itemList.Count; i++)
            {
                itemList[i].Update();
            }
        }

        public void OnNextStageRefresh()
        {
            for (int i = 0; i < itemList.Count; i++)
            {
                itemList[i].OnPick(null);
                ClassManager.Free(itemList[i]);
            }
            itemList.Clear();
        }

        private void CheckDropUIPool()
        {
            if (dropUIPool != null)
            {
                return;
            }

            var obj = PveResourceManager.GetResource(PveResourceManager.EPveResType.UI, 0);
            if (obj != null)
            {
                dropUIPoolRoot = new GameObject("[DropUIRoot]");
                dropUIPoolRoot.SetActive(false);
                dropUIPoolRoot.transform.SetParent(PveScene.pveRootTrans);
                dropUIPool = new List<DropFlyUI>();
                dropUIPool.Add(new DropFlyUI
                {
                    uiObject = obj,
                    rectTransform = obj.GetComponent<RectTransform>(),
                });
                obj.transform.SetParent(dropUIPoolRoot.transform);
                for (int i = 0; i < 20; i++)
                {
                    var o = PveResourceManager.GetResource(PveResourceManager.EPveResType.UI, 0);
                    dropUIPool.Add(new DropFlyUI
                    {
                        uiObject = o,
                        rectTransform = o.GetComponent<RectTransform>(),
                    });
                    obj.transform.SetParent(dropUIPoolRoot.transform);
                }
            }
        }

        public DropFlyUI GetDropUI()
        {
            if (dropUIPool == null)
            {
                CheckDropUIPool();
            }
            if (dropUIPool != null && dropUIPool.Count > 0)
            {
                int index = dropUIPool.Count - 1;
                var ui = dropUIPool[index];
                ui.uiObject.SetActive(true);
               
                dropUIPool.RemoveAt(index);
                return ui;
            }
            return null;
        }

        public void RecoverDropUI(DropFlyUI ui)
        {
            ui.uiObject.SetActive(true);
            ui.uiObject.transform.SetParent(dropUIPoolRoot.transform);
            dropUIPool.Add(ui);
        }

        private void CheckPickUp()
        {
            var teamList = UnitManager.Instance.GetAllUnitByTeam(0);
            for (int i = 0; i < teamList.Count; i++)
            {
                var unit = teamList[i];
                for (int j = 0; j < itemList.Count; j++)
                {
                    var item = itemList[j];
                    if (item.CheckIsCanPick(unit.Data.position, PveUtils.globalRatio * 1.5f))
                    {
                        item.OnPick(unit);
                        ClassManager.Free(item);
                        itemList.RemoveAt(j);
                        j--;
                    }
                }
            }
        }
    }
}